import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test02 {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class<Books> aClass = Books.class;

        // 获取所有 public 修饰的方法
        Method[] methods = aClass.getMethods();
        System.out.println(methods.length);
//        for (Method method : methods){
//            System.out.println(method.getName());
//        }

        // 获取所有方法 [重写的 或者自己扩展的方法 直接继承过来的没有]
        Method[] methods1 = aClass.getDeclaredMethods();
        System.out.println(methods.length);
//        for (Method method : methods1){
//            System.out.println(method.getName());
//        }

        Method method = aClass.getMethod("toString");
        System.out.println(method.getName());

        Constructor<Books> constructor = aClass.getConstructor(String.class);
        Books books = constructor.newInstance("三味书屋");
        System.out.println(books.getName());

        // 获取 一个指定名称 指定参数列表的 public 修饰的方法
        Method method1 = aClass.getMethod("read", String.class);
        System.out.println(method1.getName());

        // 获取 一个指定名称 指定参数列表的方法
        Method buy = aClass.getDeclaredMethod("buy", double.class);
        System.out.println(buy.getName());

        // 设置不检查访问权限
        buy.setAccessible(true);
        // 执行方法  指定哪个对象去执行这个方法  实参参数列表  obj.makeMoney(12)
        buy.invoke(new Books("wdd"),25.6);
        buy.invoke(new Books("fewdf"),36.6);
    }
}
